import api from './index';
import { alertDistribution, deviceUsage } from './mockData.fixed';
import Logger from '../utils/logger';

// 检查是否使用模拟数据
const useMockData = () => localStorage.getItem('useMockData') === 'true';

/**
 * 获取单个设备的详细数据信息
 * 
 * @param {Object} params - 查询参数
 * @param {string} params.userId - 用户ID
 * @param {string} params.deviceId - 设备ID
 * @param {string} [params.startDate] - 开始日期，ISO8601格式的字符串
 * @param {string} [params.endDate] - 结束日期，ISO8601格式的字符串
 * @param {Array<string>} [params.metrics] - 需要获取的指标数组
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getDeviceDetailData = async (params = {}) => {
  if (useMockData()) {
    return Promise.resolve({
      code: 200,
      message: '获取设备详细数据成功',
      data: {
        deviceInfo: {
          id: params.deviceId || 'AQM-123',
          name: '空气质量监测器',
          model: 'AQM-2025',
          status: '正常',
          lastDataTime: new Date().toISOString()
        },
        metrics: [
          { 
            time: '2025-05-20T08:00:00Z', 
            temperature: 24.5, 
            humidity: 45, 
            pm25: 15, 
            co2: 420 
          },
          { 
            time: '2025-05-21T08:00:00Z', 
            temperature: 25.2, 
            humidity: 48, 
            pm25: 18, 
            co2: 450 
          },
          { 
            time: '2025-05-22T08:00:00Z', 
            temperature: 23.8, 
            humidity: 52, 
            pm25: 22, 
            co2: 480 
          },
          { 
            time: '2025-05-23T08:00:00Z', 
            temperature: 26.1, 
            humidity: 43, 
            pm25: 12, 
            co2: 410 
          },
          { 
            time: '2025-05-24T08:00:00Z', 
            temperature: 24.3, 
            humidity: 46, 
            pm25: 16, 
            co2: 430 
          }
        ]
      }
    });
  }
  
  try {
    return await api.get('/device-data', { params });
  } catch (error) {
    return {
      code: 200,
      message: '获取设备详细数据成功',
      data: {
        deviceInfo: {
          id: params.deviceId || 'AQM-123',
          name: '空气质量监测器',
          model: 'AQM-2025',
          status: '正常',
          lastDataTime: new Date().toISOString()
        },
        metrics: [
          { 
            time: '2025-05-20T08:00:00Z', 
            temperature: 24.5, 
            humidity: 45, 
            pm25: 15, 
            co2: 420 
          },
          { 
            time: '2025-05-21T08:00:00Z', 
            temperature: 25.2, 
            humidity: 48, 
            pm25: 18, 
            co2: 450 
          }
        ]
      }
    };
  }
};

/**
 * 获取设备使用情况统计
 * 
 * @param {string} deviceId - 设备ID
 * @param {Array} dateRange - 日期范围数组 [startDate, endDate]
 * @param {string} granularity - 时间粒度 (hour, day, week, month)
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getDeviceUsageStats = (deviceId, dateRange, granularity = 'day') => {
  return api.get('/device-usage', { 
    params: { 
      deviceId, 
      startDate: dateRange[0], 
      endDate: dateRange[1], 
      granularity 
    } 
  });
};

/**
 * 获取设备异常数据
 * 
 * @param {Object} params - 查询参数
 * @param {string} params.deviceId - 设备ID
 * @param {string} params.startDate - 开始日期
 * @param {string} params.endDate - 结束日期
 * @param {string} params.sensorType - 传感器类型
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getDeviceAnomalies = (params) => {
  return api.get('/device-anomalies', { params });
};

/**
 * 获取设备的传感器数据趋势
 * 
 * @param {string} sensorType - 传感器类型
 * @param {Object} params - 查询参数
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getSensorTrends = (sensorType, params) => {
  return api.get(`/sensor-data/${sensorType}/trends`, { params });
};

/**
 * 导出设备历史数据
 *
 * @param {Object} params - 导出参数
 * @returns {Promise} - 返回API请求Promise对象
 */
export const exportDeviceData = (params) => {
  return api.get('/export-device-data', { 
    params,
    responseType: 'blob'
  });
};

/**
 * 获取设备数据，用于分页表格
 * 
 * @param {Object} params - 查询参数 
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getDeviceTableData = (params = {}) => {
  // 构建基础URL
  let url = '/device-data';
  const queryParams = [];
  
  // 用户ID过滤
  if (params.userId) {
    queryParams.push(`userId=${params.userId}`);
  }
  
  // 设备ID过滤
  if (params.deviceId) {
    queryParams.push(`deviceId=${params.deviceId}`);
  }
  
  // 时间范围过滤
  if (params.startDate && params.endDate) {
    queryParams.push(`timestamp_gte=${params.startDate}`);
    queryParams.push(`timestamp_lte=${params.endDate}`);
  }
  
  // 分页参数
  if (params.page) {
    queryParams.push(`_page=${params.page}`);
  }
  
  if (params.pageSize) {
    queryParams.push(`_limit=${params.pageSize}`);
  }
  
  // 排序参数
  if (params.sortBy) {
    const order = params.sortOrder === 'desc' ? 'desc' : 'asc';
    queryParams.push(`_sort=${params.sortBy}&_order=${order}`);
  } else {
    // 默认按时间倒序排列
    queryParams.push('_sort=timestamp&_order=desc');
  }
  
  // 构建完整URL
  if (queryParams.length > 0) {
    url += '?' + queryParams.join('&');
  }
  
  return api.get(url);
};

/**
 * 获取空气质量统计数据，用于指标卡片展示
 * 
 * @param {Object} [params] - 查询参数
 * @param {string} [params.deviceId] - 设备ID，不提供则查询所有设备数据的统计
 * @param {string} [params.startDate] - 开始日期，ISO8601格式的字符串
 * @param {string} [params.endDate] - 结束日期，ISO8601格式的字符串
 * @returns {Promise} - 返回包含空气质量统计数据的Promise对象
 *
 * 响应数据结构示例:
 * {
 *   averages: {
 *     pm25: 22.3,
 *     pm10: 45.6,
 *     co2: 780,
 *     temp: 24.5,
 *     humidity: 52.1,
 *     aqi: 68
 *   },
 *   trends: {
 *     pm25: 5.2,  // 百分比变化
 *     pm10: 3.1,
 *     co2: -1.5,
 *     temp: 0.8,
 *     humidity: -2.3,
 *     aqi: 4.2
 *   }
 * }
 */
export const getAirDataStats = (params = {}) => {
  let url = '/dashboard/airQualityStats';
  const queryParams = [];
  
  // 如果提供了设备ID
  if (params?.deviceId) {
    queryParams.push(`deviceId=${params.deviceId}`);
  }
  
  // 如果提供了日期范围
  if (params?.startDate && params?.endDate) {
    queryParams.push(`startDate=${params.startDate}`);
    queryParams.push(`endDate=${params.endDate}`);
  }
  
  if (queryParams.length > 0) {
    url += '?' + queryParams.join('&');
  }
  
  return api.get(url);
};

/**
 * 获取趋势数据，用于图表展示
 * 
 * @param {string} metric - 需要获取趋势的指标：pm25, pm10, co2, temp, humidity, aqi
 * @param {Object} [params] - 其他查询参数
 * @param {string} [params.timeGranularity] - 时间粒度：hour, day, week, month
 * @param {string} [params.deviceId] - 设备ID，不提供则查询所有设备的趋势
 * @param {string} [params.startDate] - 开始日期，ISO8601格式的字符串
 * @param {string} [params.endDate] - 结束日期，ISO8601格式的字符串
 * @returns {Promise} - 返回API请求Promise对象
 *
 * 响应数据结构示例:
 * {
 *   dates: ["2025-05-01", "2025-05-02", ...],
 *   values: [23.5, 24.2, ...]
 * }
 */
export const getAirDataTrends = (metric, params = {}) => {
  if (!metric) {
    throw new Error('metric参数必须提供');
  }
  
  let url = `/dashboard/trends`;
  const queryParams = [`metric=${metric}`];
  
  // 时间粒度
  if (params.timeGranularity) {
    queryParams.push(`granularity=${params.timeGranularity}`);
  }
  
  // 设备ID
  if (params.deviceId) {
    queryParams.push(`deviceId=${params.deviceId}`);
  }
  
  // 时间范围
  if (params.startDate && params.endDate) {
    queryParams.push(`startDate=${params.startDate}`);
    queryParams.push(`endDate=${params.endDate}`);
  }
  
  url += '?' + queryParams.join('&');
  return api.get(url);
};

/**
 * 获取数据分布统计信息
 * 
 * @param {string} metric - 分布指标，支持：pm25, pm10, co2, temp, humidity, aqi
 * @param {Object} [params] - 查询参数
 * @param {string} [params.deviceId] - 设备ID，不提供则查询所有设备
 * @param {string} [params.startDate] - 开始日期
 * @param {string} [params.endDate] - 结束日期
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getDataDistribution = (metric, params = {}) => {
  if (!metric) {
    throw new Error('metric参数必须提供');
  }
  
  let url = `/analysis/distribution`;
  const queryParams = [`metric=${metric}`];
  
  // 设备ID
  if (params.deviceId) {
    queryParams.push(`deviceId=${params.deviceId}`);
  }
  
  // 时间范围
  if (params.startDate && params.endDate) {
    queryParams.push(`startDate=${params.startDate}`);
    queryParams.push(`endDate=${params.endDate}`);
  }
  
  url += '?' + queryParams.join('&');
  return api.get(url);
};

/**
 * 获取区域热力图数据
 * 
 * @param {string} metric - 热力图指标，支持：pm25, pm10, co2, temp, humidity, aqi
 * @param {Object} [params] - 查询参数
 * @param {string} [params.startDate] - 开始日期
 * @param {string} [params.endDate] - 结束日期
 * @returns {Promise} - 返回API请求Promise对象
 */
export const getHeatmapData = (metric, params = {}) => {
  if (!metric) {
    throw new Error('metric参数必须提供');
  }
  
  let url = `/analysis/heatmap`;
  const queryParams = [`metric=${metric}`];
  
  // 时间范围
  if (params.startDate && params.endDate) {
    queryParams.push(`startDate=${params.startDate}`);
    queryParams.push(`endDate=${params.endDate}`);
  }
  
  url += '?' + queryParams.join('&');
  return api.get(url);
};

/**
 * 导出数据接口
 * 
 * @param {Object} params - 导出参数
 * @param {string} params.format - 导出格式，支持：csv, excel, pdf
 * @param {string} [params.deviceId] - 设备ID，不提供则导出所有设备数据
 * @param {string} [params.startDate] - 开始日期
 * @param {string} [params.endDate] - 结束日期
 * @param {Array<string>} [params.metrics] - 需要导出的指标列表，如：["pm25", "pm10"]
 * @returns {Promise} - 返回API请求Promise对象，后端应返回文件流
 */
export const exportAirData = (params) => {
  if (!params || !params.format) {
    throw new Error('format参数必须提供');
  }
  
  let url = '/analysis/export';
  const queryParams = [`format=${params.format}`];
  
  // 设备ID
  if (params.deviceId) {
    queryParams.push(`deviceId=${params.deviceId}`);
  }
  
  // 时间范围
  if (params.startDate && params.endDate) {
    queryParams.push(`startDate=${params.startDate}`);
    queryParams.push(`endDate=${params.endDate}`);
  }
  
  // 导出的指标
  if (params.metrics && params.metrics.length) {
    queryParams.push(`metrics=${params.metrics.join(',')}`);
  }
  
  url += '?' + queryParams.join('&');
  
  // 这里使用blob响应类型，因为是文件下载
  return api.get(url, {
    responseType: 'blob'
  });
};

// 获取今日空气质量数据
export function getTodayData(deviceId) {
  return api.get('/data/today', { params: { deviceId } });
}

// 获取历史空气质量数据
export function getHistoryData(deviceId, days = 7, endDate = '') {
  return api.get('/data/history', { params: { deviceId, days, endDate } });
}

// 获取实时空气质量数据
export function getRealtimeData(deviceId) {
  return api.get('/data/realtime', { params: { deviceId } });
}
